package com.itlong.cloud.utils.words;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数字处理工具
 *
 * @craeteDate 2017--19 19:04
 */
public class NumberHandlerUtil {

    /**
     * 格式化数字，前置补零
     *
     * @param number 待格式化的自然数
     * @param length 格式化长度
     * @return
     */
    public static String numFormatToString(int number, int length) {
        // 0 代表前面补充0
        // 4 代表长度为4
        // d 代表参数为正数型
        String str = String.format("%0" + length + "d", number);
        return str;
    }

    /**
     * 获取 N 位随机数
     *
     * @param digit
     * @return
     */
    public static String randomNum(int digit) {
        Random random = new Random();
        String result = "";
        for (int i = 0; i < digit; i++) {
            result += random.nextInt(10);
        }
        return result;
    }

    /**
     * 检验字符串是否是手机号码
     *
     * @param phone
     * @return
     */
    public static boolean isPhoneNo(String phone) {
        if (phone == null || phone.length() != 11) {
            return false;
        }
        Pattern pattern = Pattern.compile("[0-9]+");
        Matcher matcher = pattern.matcher((CharSequence) phone);
        return matcher.matches();
    }

    /**
     * 验证邮箱地址是否正确
     * @param email
     * @return
     */
    public static boolean checkEmail(String email){
        boolean flag = false;
        // 验证邮箱的正则表达式
        String format = "\\p{Alpha}\\w{2,15}[@][a-z0-9]{3,}[.]\\p{Lower}{2,}";
        //p{Alpha}:内容是必选的，和字母字符[\p{Lower}\p{Upper}]等价。如：200896@163.com不是合法的。
        //w{2,15}: 2~15个[a-zA-Z_0-9]字符；w{}内容是必选的。 如：dyh@152.com是合法的。
        //[a-z0-9]{3,}：至少三个[a-z0-9]字符,[]内的是必选的；如：dyh200896@16.com是不合法的。
        //[.]:'.'号时必选的； 如：dyh200896@163com是不合法的。
        //p{Lower}{2,}小写字母，两个以上。如：dyh200896@163.c是不合法的。
        flag =email.matches(format);
        return flag;
    }


    /**
     * <desc>
     *    判断一个整型是否在指定范围（闭区间）内[lowerLimit,upperLimit].
     * </desc>
     *
     * @param value      用于判断的整数
     *                   * @param lowerLimit 用于判断的整数
     * @param upperLimit 用于判断的整数
     * @return True:在[lowerLimit,upperLimit]之间  false：不在[lowerLimit,upperLimit]之间
     * @author LewisLouis
     * @createDate 2017-10-17
     */
    public static boolean isInRange(Integer value, Integer lowerLimit, Integer upperLimit) {
        if ((null == value) || (lowerLimit == null) || (upperLimit == null)) {
            return false;
        }
        return (value.intValue() >= lowerLimit.intValue() && value <= upperLimit.intValue());
    }

    /**
     * <desc>
     *      判断2个Integer数值是否相等
     * <desc/>
     *
     * @param value1
     * @param value2
     * @return 若任一值为null，则返回false
     * @author Chunjian.G
     * @createDate 2017-11-22
     */
    public static boolean isEqual(Integer value1, Integer value2){
        if (null == value1 || null==value2){
            return false;
        }
        return value1 == value2;
    }

    /**
     * <desc>
     *      判断 value1 是否大于 value2
     * <desc/>
     *
     * @param value1
     * @param value2
     * @return 若任一值为null，则返回false
     * @author Chunjian.G
     * @createDate 2017-11-22
     */
    public static boolean isGreaterThan(Integer value1, Integer value2){
        if (null == value1 || null==value2){
            return false;
        }
        return value1 > value2;
    }

    /**
     * <desc>
     *      判断 value1 是否大于等于 value2
     * <desc/>
     *
     * @param value1
     * @param value2
     * @return 若任一值为null，则返回false
     * @author Chunjian.G
     * @createDate 2017-11-22
     */
    public static boolean isEqualOrGreaterThan(Integer value1, Integer value2){
        if (null == value1 || null==value2){
            return false;
        }
        return value1 >= value2;
    }

    /**
     * <desc>
     *      判断 value1 是否小于 value2
     * <desc/>
     *
     * @param value1
     * @param value2
     * @return 若任一值为null，则返回false
     * @author Chunjian.G
     * @createDate 2017-11-22
     */
    public static boolean isLessThan(Integer value1, Integer value2){
        if (null == value1 || null==value2){
            return false;
        }
        return value1 < value2;
    }

    /**
     * <desc>
     *      判断 value1 是否小于等于 value2
     * <desc/>
     *
     * @param value1
     * @param value2
     * @return 若任一值为null，则返回false
     * @author Chunjian.G
     * @createDate 2017-11-22
     */
    public static boolean isEqualOrLessThan(Integer value1, Integer value2){
        if (null == value1 || null==value2){
            return false;
        }
        return value1 <= value2;
    }

    /**
     * 微信支付 将金额转换成分
     * @param fee 元格式的
     * @return 分
     * @author Juguang.S
     * @createDate 2018-04-18
     */
    public static String changeToFen(Double fee){
        String priceStr = "";
        if(fee != null){
            int p = (int)(fee * 100); //价格变为分
            priceStr = Integer.toString(p);
        }
        return priceStr;
    }

    /**
     * 微信支付 得到本地机器的IP
     * @return
     * @author Juguang.S
     * @createDate 2018-04-18
     */
    private static String getHostIp(){
        String ip = "";
        try{
            ip = InetAddress.getLocalHost().getHostAddress();
        }catch(UnknownHostException e){
            e.printStackTrace();
        }
        return ip;
    }

    /**
     * <desc>
     *      判断字符串是否是纯数字
     * </desc>
     *
     * @createDate  2020/8/11
     */
    public static boolean isInteger(String str) {
        Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
        return pattern.matcher(str).matches();
    }
}
